# 加载包和测试工具
library(testthat)
library(jiptest)

# 全局测试配置：测试目录（和你实际使用的一致）
test_dir <- system.file("extdata/test/", package = "jiptest")

# 前置检查：如果测试目录不存在/无有效文件，直接跳过所有测试（避免报错）
all_xlsx_files <- if (dir.exists(test_dir)) {
  list.files(test_dir, pattern = "\\.xlsx$", full.names = TRUE)
} else {
  character(0)
}
valid_files <- all_xlsx_files[!grepl("test_invalid", all_xlsx_files)]  # 排除无效文件（如果有）
if (length(valid_files) == 0) {
  skip("测试目录无有效 .xlsx 文件，跳过所有核心测试")
}

# ------------------------------
# 1. 测试数据读取：只验证“不报错、非空”
# ------------------------------
test_that("数据读取：能批量读取文件，不报错、非空", {
  result <- read_all_induction(test_dir, pattern = "\\.xlsx$", verbose = FALSE)
  expect_no_error(result)
  expect_true(nrow(result) > 0)
})

# ------------------------------
# 2. 测试JIP计算：只验证“不报错、计算结果非空”
# ------------------------------
test_that("JIP计算：能批量计算参数，不报错、结果非空", {
  all_data <- read_all_induction(test_dir, pattern = "\\.xlsx$", verbose = FALSE)
  params_dc <- jip_test(all_data, use_PAM = FALSE, verbose = FALSE)
  params_pam <- jip_test(all_data, use_PAM = TRUE, verbose = FALSE)
  
  expect_no_error(params_dc)
  expect_no_error(params_pam)
  expect_true(nrow(params_dc) > 0)
  expect_true(nrow(params_pam) > 0)
  expect_true(length(setdiff(colnames(params_dc), "SOURCE")) > 0)
})

# ------------------------------
# 3. 测试作图：删除 verbose = FALSE 参数（核心修改！）
# ------------------------------
test_that("作图：能正常绘图，不报错", {
  # 第一步：读取数据（取前2个样本）
  all_data <- read_all_induction(test_dir, pattern = "\\.xlsx$", verbose = FALSE)
  sample_names <- unique(all_data$SOURCE)[1:min(2, length(unique(all_data$SOURCE)))]
  plot_data <- all_data[all_data$SOURCE %in% sample_names, ]
  
  # 关键修改：删掉 verbose = FALSE，plot() 函数不需要这个参数
  expect_no_error({
    png(tempfile())  # 打开临时PNG设备
    plot(plot_data, use_PAM = FALSE)  # 删掉 verbose = FALSE
    dev.off()        # 关闭设备
  })
  
  expect_no_error({
    png(tempfile())  # 打开临时PNG设备
    plot(plot_data, use_PAM = TRUE)   # 删掉 verbose = FALSE
    dev.off()        # 关闭设备
  })
})

# ------------------------------
# 4. 测试PCA预处理：只验证“样本够就不报错、输出非空”
# ------------------------------
test_that("PCA预处理：样本数足够时能正常运行，不报错", {
  all_data <- read_all_induction(test_dir, pattern = "\\.xlsx$", verbose = FALSE)
  params <- jip_test(all_data, use_PAM = FALSE, verbose = FALSE)
  
  if (nrow(params) >= 2) {
    pca_matrix <- jip_pca(params)
    expect_no_error(pca_matrix)
    expect_true(nrow(pca_matrix) > 0)
  } else {
    skip("样本数不足2个，跳过PCA测试")
  }
})

# ------------------------------
# 5. 异常处理：匹配实际报错信息（文件不存在）
# ------------------------------
test_that("异常处理：读取不存在的文件时报错友好", {
  expect_error(
    read_induction("不存在的文件.xlsx"),
    regexp = "does not exist|不存在",  # 兼容中英文报错
    fixed = FALSE
  )
})

